﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

/*
单例模式思路：
1.把无参构造函数和拷贝构造函数私有化；
2.定义一个类的静态成员指针；
3.在类外初始化，new一个对象；
4.把指针的权限设为私有，然后提供一个静态成员函数让外面获取这个指针。

*/

class Maker {
public:
	static Maker* getInstance() {
		/*if(instance == NULL)
			instance = new Maker;*/
		return instance;
	}
private:
	Maker() {
		cout << "私有构造函数" << endl;
	}
	// 将拷贝构造函数私有化，防止创建多个实例 
	Maker(const Maker &m) {

	}
private:
	static Maker* instance;
};
// 在类外初始化单例 
// Maker::instance是private的，为什么在类外可以访问呢？
// c++要求类的静态成员在类外初始化，所以可以让私有静态成员在类外部访问，否则没办法初始化了；
// Maker::instance中，Maker::表示作用域在Maker类内，编译器把Maker::instance当作在类内。
Maker* Maker::instance = new Maker;

void test01() {
	Maker * m = Maker::getInstance();
	Maker * m1 = Maker::getInstance();
	cout << "m=" << m << endl; // 011D0578 
	cout << "m1=" << m1 << endl; // 011D0578 
	// Maker m2 = *m1; // 会创建新的对象实例，然后调用拷贝构造函数，解决办法是把拷贝构造函数变为private的，不能对Maker类型赋值  
	// cout << "&m2=" << &m2 << endl; // 006FF873 
}

int main()
{

	test01(); 

	system("pause");
	return EXIT_SUCCESS;
}